package com.flyqiu.common.mybaits.plus;

import com.alibaba.fastjson2.JSONObject;
import com.flyqiu.common.mybaits.plus.enums.FlyQiuQueryCondition;
import com.flyqiu.common.tools.FlyQiuCollectionTools;
import org.apache.commons.lang3.StringUtils;

import java.util.Map;
import java.util.Set;

/**
 * 通用查询条件封装类。
 */
public class FlyQiuQueryWrapper extends AbstractCommonQuery<Object> {


    /**
     * 默认构造方法。
     */
    public FlyQiuQueryWrapper() {
    }

    /**
     * 使用 JSON 对象初始化查询条件。
     *
     * @param data JSON 对象数据
     */
    public FlyQiuQueryWrapper(JSONObject data) {
        if (data == null || data.isEmpty()) {
            return;
        }
        for (String key : data.keySet()) {
            parameterMap.put(key, data.getString(key));
        }
    }

    /**
     * 使用 Map 初始化查询条件。
     *
     * @param data 字符串数组形式的数据映射
     */
    public FlyQiuQueryWrapper(Map<String, ?> data) {

        for (String key : data.keySet()) {
            Object object = data.get(key);
            parameterMap.put(key, String.valueOf(object));
        }
    }

    /**
     * 是否启用驼峰命名。
     *
     * @return 返回 false，表示不启用驼峰命名
     */
    @Override
    public boolean enableHumpNaming() {
        return false;
    }

    /**
     * 解析搜索条件。
     *
     * @param prefix 条件前缀
     */
    @Override
    public void analysisSearchQuery(String prefix) {
        if (FlyQiuCollectionTools.isEmpty(parameterMap)) {
            return;
        }
        if (StringUtils.isEmpty(prefix)) {
            prefix = "";
        }
        Set<String> keys = parameterMap.keySet();

        for (String objKey : keys) {
            if (!objKey.startsWith(prefix)) {
                continue;
            }
            String columnValues = parameterMap.getOrDefault(objKey, null);
            if (StringUtils.isBlank(columnValues)) {
                return;
            }
            QueryRuleModel ruleCondition = FlyQiuQueryCondition.getRuleCondition(columnValues);
            ruleCondition.setColName(objKey.replace(prefix, ""));
            constructorCondition(ruleCondition);
        }
    }

    /**
     * 解析排序条件。
     *
     * @param prefix 条件前缀
     */
    @Override
    public void analysisQueryOrder(String prefix) {
        Set<String> keys = parameterMap.keySet();
        QueryRuleModel ruleModel;
        for (String objKey : keys) {
            if (!objKey.startsWith(prefix)) {
                continue;
            }
            String columnValues = parameterMap.getOrDefault(objKey, null);
            if (StringUtils.isBlank(columnValues)) {
                continue;
            }
            FlyQiuQueryCondition conditionEnum = FlyQiuQueryCondition.ORDER_BY_ASC;
            if (columnValues.trim().equalsIgnoreCase("desc")) {
                conditionEnum = FlyQiuQueryCondition.ORDER_BY_DESC;
            }
            ruleModel = new QueryRuleModel();
            ruleModel.setCondition(conditionEnum);
            ruleModel.setColName(objKey.replace(prefix, ""));
            constructorCondition(ruleModel);
        }
    }


}
